package com.shen.jcbf.jdk8bf.forkjoin;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 说明：thread_AtomicBoolean 测试
 * 
 * Boolean值的变化的时候不允许在之间插入，保持操作的原子性
 * 
 * 它提供了原子性操作,其中exists.compareAndSet(false, true)这个操作把比较和赋值操作组成了一个原子操作,
 * 中间不会提供可乘之机.输出为
 * 
 * AtomicBoolean 高效并发处理 “只初始化一次”
 * 
 * 可以让一个线程等待另一个线程完成任务后再执行:
 * 
 * @author shenhx
 * @date 2017年6月20日
 */
public class AtomicBooleanTest {
	public static void main(String[] args) {
		Thread t3 = new Thread(new BarWorker("cc"));
		Thread t2 = new Thread(new BarWorker("bb"));
		Thread t1 = new Thread(new BarWorker("aa"));
		t3.run();
		t2.run();
		t1.run();
	}

	private static class BarWorker implements Runnable {
		//这个值需要定义为 false
		private static AtomicBoolean exists = new AtomicBoolean(false);
		private String name;

		public BarWorker(String name) {
			this.name = name;
		}

		public void run() {
			if (exists.compareAndSet(false, true)) {
				// 当第一个线程设置为true后，另外的线程是进不来的
				System.out.println(name + " enter" + "currentvalue=" + exists.get());
				try {
					System.out.println(name + " working");
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// do nothing
				}
				System.out.println(name + " leave");
				exists.set(false);
			} else {
				System.out.println(name + " give up");
			}
		}
	}
}
